<?php

/**
 * Блок меню навигации для авторизованного пользователя.
 *
 */
class Kernel_Block_Navigation extends Kernel_Block
{
    /**
     * Наименование меню, данные которого нужно вернуть.
     *
     * @var string
     */
    public $menu;

    /**
     * Наименование меню навигации по умолчанию.
     *
     * @var integer
     */
    static private $_default;

    /**
     * Кэш данных навигации.
     *
     * @var array
     */
    static private $_menu = array();

    /**
     * Возвращает данные шаблона для формирования блока.
     *
     * @return  array
     */
    public function getData()
    {
        $name = $this->menu ? $this->menu : self::_getDefault();

        if (!isset(self::$_menu[$name]))
        {
            self::$_menu[$name] = $this->_fetch($name);
        }

        return array('menu' => self::$_menu[$name]);
    }

    /**
     * Поднимает данные указанного меню из БД.
     *
     * @param   string  $name
     * @return  array
     */
    private function _fetch($name)
    {
        $query = 'SELECT
                         `i`.`id`,
                         `i`.`parent_id`,
                         `r`.`name`,
                         `r`.`url`,
                         IF(`r`.`id` = ' . (int)Kernel_Filter_Structure::getMenuId() . ', 1, 0) `active`
                    FROM
                         `system_navigation_item` `i`
              INNER JOIN
                         `system_resource` `r`
                      ON
                         `r`.`id` = `i`.`resource_id`
              INNER JOIN
                         `system_navigation` `n`
                      ON
                         `n`.`id` = `i`.`menu_id`
                   WHERE
                         `n`.`name` = "' . database::escape($name) . '"
                ORDER BY
                         `i`.`position`';

        foreach (array_keys($items = database::fetchAll($query)) as $key)
        {
            $items[$key]['class'] = self::_getClass($items[$key]['url']);
        }

        return Kernel_Util_Tree::convert($items);
    }

    /**
     * Возвращает идентификатор меню навигации по умолчанию.
     *
     * @return  integer
     */
    static private function _getDefault()
    {
        if (!isset(self::$_default))
        {
            $query = 'SELECT
                             `name`
                        FROM
                             `system_navigation`
                    ORDER BY
                             `id`
                       LIMIT
                             1';

            self::$_default = database::fetchOne($query);
        }

        return self::$_default;
    }

    /**
     * Возвращает наименование класса элемента меню. Фактически, с т.з.
     * семантики это его идентификатор, просто поле 'id' уже забито для
     * построения дерева.
     *
     * @param   string  $url
     * @return  string
     */
    static private function _getClass($url)
    {
        return preg_match('|([^/]+)/?$|', $url, $matches) ? $matches[1] : 'home';
    }
}
